Consultas LINQ

Descripcion

Como utilizar LINQ para filtrar y ordenar datos de consultas.

Escenario

Partimos de una aplicación que usa EFCore y que realiza una consulta a la tabla Estudiantes:

using EFCoreExample;
using Microsoft.EntityFrameworkCore;

using (ColegioContext db = new())
{
    DbSet<Estudiante>? estudiantes = db.Estudiantes;

    foreach (Estudiante e in estudiantes)
    {
        Console.WriteLine($"{e.Id}: {e.Nombre}");
    }
}
Filtrar datos

Para filtrar consultas con LINQ usamos el método Where sobre el DbSet de la consulta, y como parámetro del Where indicamos una función lambda que indicará la condición que se usará para filtrar, en este caso la longitud del nombre:

using EFCoreExample;
using Microsoft.EntityFrameworkCore;

using (ColegioContext db = new())
{
    DbSet<Estudiante>? estudiantes = db.Estudiantes;

    IQueryable<Estudiante> estudiantesFiltro = estudiantes.Where(e => e.Nombre.Length > 4);

    foreach (Estudiante e in estudiantesFiltro)
    {
        Console.WriteLine($"{e.Id}: {e.Nombre}");
    }
}

Otro ejemplo podría ser el siguiente filtrando por el contenido del nombre:

using EFCoreExample;
using Microsoft.EntityFrameworkCore;

using (ColegioContext db = new())
{
    DbSet<Estudiante>? estudiantes = db.Estudiantes;

    IQueryable<Estudiante> estudiantesFiltro = estudiantes.Where(e => e.Nombre.Contains("n"));

    foreach (Estudiante e in estudiantesFiltro)
    {
        Console.WriteLine($"{e.Id}: {e.Nombre}");
    }
}
Ordenar datos

Para realizar la ordenación de los datos solo tenemos que concatenar al final del metodo Where el metodo OrderedBy o OrderByDescending pasándole como argumento una lambda indicando el parámetro sobre el que realizaremos la ordenación:

.OrderByDescending(e => e.Nombre)
using EFCoreExample;
using Microsoft.EntityFrameworkCore;

using (ColegioContext db = new())
{
    DbSet<Estudiante>? estudiantes = db.Estudiantes;

    IQueryable<Estudiante> estudiantesFiltro = estudiantes.Where(e => e.Nombre.Contains("n")).OrderByDescending(e => e.Nombre);

    foreach (Estudiante e in estudiantesFiltro)
    {
        Console.WriteLine($"{e.Id}: {e.Nombre}");
    }
}

En este caso estamos ordenando la última consulta pero de manera descendente:

Ejecución en diferido

Las consultas de LINQ no se ejecutan en el momento en el que se generan, si no que se ejecutan cuando se van a consultar los datos (ya sea cuando se recorrer la consulta con un foreach o cuando se llama algun método sobre la consulta (en este caso estudiantes o estudiantesFiltro son las consultas) que necesite obtener los datos), de manera que se generan las consultas por completo para obtener ya todos los datos filtrados y ordenados.

No se obtienen todos los datos de la base de datos y se filtran en la aplicación, como podría parecer al mirar el código, sino que se genera una consulta para la base de datos con la que se obtenga la información ya filtrada y ordenada.

Tags

C# | LINQ